tornado的路由映射

tornado的路由映射

先前我们在构建路由映射列表的时候,使用的是二元元组,如

[(r"/", IndexHandler),]

在多个参数传入的时候

我们可以:

  • 指定传入参数(字典形式)
  • url的名字,用于反向解析
[
    (r"/", Indexhandler),
    (r"/cpp", SubjectHandler, {"subject":"c++"}),
    url(r"/python", SubjectHandler, {"subject":"python"}, name="python_url")
]

对于路由中的字典,会传入到对应的RequestHandler的initialize()方法中:

from tornado.web import RequestHandler
class ItcastHandler(RequestHandler):
    def initialize(self, subject):
        self.subject = subject

    def get(self):
        self.write(self.subject)

思考:怎么传入?

对于路由中的name字段,注意此时不能再使用元组,而应使用tornado.web.url来构建。name是给该路由起一个名字,可以通过调用RequestHandler.reverse_url(name)来获取该名子对应的url。

完整示例:

# coding:utf-8

import tornado.ioloop
import tornado.web
import tornado.httpserver

from tornado.web import url


class IndexView(tornado.web.RequestHandler):
    def get(self):
        a_url = self.reverse_url("python_url")

        self.write("""<a href="%s">123"""%a_url)

class SubjectView(tornado.web.RequestHandler):

    def initialize(self, subject):
        self.subject = subject

    def get(self):
        self.write(self.subject)

if __name__ == '__main__':

    app = tornado.web.Application([
        (r"/", IndexView),
        (r"/cpp", SubjectView, {"subject":"c++"}),
        url(r"/python", SubjectView, {"subject":"python"}, name="python_url"),
        ], debug=True)
    http_server = tornado.httpserver.HTTPServer(app)
    http_server.listen(8000)
    tornado.ioloop.IOLoop.current().start()

思考:变量名和 字符串匹配

思考:form-data www-form-urlencoded raw binary区别

canshu

print self.get_arguments("a")

[u'666', u'777', u'1', u'2']

print self.get_argument("a")

2

print self.get_query_argument("a")

777

print self.get_body_argument("a")

2

print self.get_query_arguments("a")

[u'666', u'777']

print self.get_body_arguments("a")

[u'1', u'2']

利用raw发送json原始数据

postman选择raw

发送 {"a":"1"} json数据类型, body中 类型是字符串格式的json数据。 json loads之后可以提取传递的数据。

class IndexView(tornado.web.RequestHandler):
    def post(self):

        print "body"
        print type(self.request.body)

        print "type"
        print self.request.headers.get("Content-Type")


        dic = json.loads(self.request.body)
        print self.write(dic.get("a"))

正则参数匹配

class YKTest(RequestHandler):

    def get(self, gnum):
        self.write(str(gnum))


if __name__ == '__main__':
    tornado.options.parse_command_line()
    app = tornado.web.Application(
        [(r"/", IndexHandler),
        (r"/python", SubjectHandler, {"subject": "python"}),
        (r"/cpp/",SubjectHandler,{"subject":"cpp"}),
        (r"/test/(?P<gnum>[\d]+)",YKTest)
        ],
        debug = True
本文总阅读量